<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>枚举</title>
  <style>
    div, p, li {
      line-height: 40px
    }
    span {
      color: red
    }
  </style>
</head>
<body>
  <p>使用枚举可以清晰的表达意图或创建一组有区别的用例TypeScript支持数字和基于字符串的枚举</p>
  <p>使用枚举的属性来访问枚举成员，使用枚举的名字来访问枚举类型</p>
  <p>不带初始化的枚举要么放在第一的位置，要么放在使用了数字常量或者其他常量初始化了的常量后面</p>
  <p>字符串枚举里，每个成员都必须用字符串字面量</p>
  <p>从技术角度来说，枚举可以混合字符串和数字成员，但是不建议这么做，除非你真的想利用Javascript运行时的行为</p>
  <span>每个枚举成员都带有一个值，它可以是 常量或 计算出来的</span>
  <h3>当满足以下条件时，枚举被称为时常量计算出来的</h3>
  <ul>
    <li>
      它是枚举的第一个成员，并且没有初始化器，这种情况下它被赋予值0
    </li>
    <li>
      它不带有初始化器且它之前的枚举成员是一个数字常量。这种情况下，当前枚举成员的值为它上一个枚举成员加一
    </li>
    <li>
      枚举成员使用常量枚举表达式初始化。常量枚举表达式是TypeScript表达式的子集，它可以在编译阶段求值。当它是通过计算得来的，它就是一个常量枚举表达式
    </li>
  </ul>
  <p>JS赋值语句返回的值就是等号右边的值</p>
  <p>枚举是在运行时真正存在的对象</p>
  <p>数字枚举成员还具有反向映射，从枚举值到枚举名字</p>
  <p>为了避免在额外生成的代码上的开销和额外的非直接的对枚举成员的访问，我们可以使用 const枚举</p>
  <p>外部枚举用来描述已经存在的枚举类型的形状</p>

  <h2>实战指南-枚举类型</h2>
  <ul>
    <li>
      TS 支持数字枚举和字符串枚举
    </li>
    <li>
      数字枚举时，是递增的
    </li>
    <li>
      枚举类型中的值必须是确定的。没有给出确定值的写法，是不被允许的，能计算出来也不行
    </li>
    <li>
      字符串枚举中，所有成员必须是字符串字面量。由于字符串没有递增的含义，字符串枚举成员都必须手动初始化。
    </li>
    <li>
      反向映射只有数字枚举中才有
    </li>
  </ul>
  
  <script src="./index.js"></script>
</body>
</html>